package net.comm.servlet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.comm.common.GlbFinal;
import net.comm.common.PatternMa;
import net.comm.pic.Jpicmk;
import net.comm.util.Function;
import net.comm.util.StringUtil;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

public class FileUploadServlet extends HttpServlet {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private final long MAX_SIZE = 3 * 1024 * 1024;// 设置上传文件最大为 3M

	// 允许上传的文件格式的列表
	private	final String[] allowedExt = new String[] { "jpg", "jpeg", "gif", "txt", "doc",
				"docx", "mp3", "wma", "m4a" };
	
	// 允许上传的图片格式列表
	private	final String picrex = "[\\w\\W]*(jpg|jpeg|gif)+[\\w\\W]*";
	
	// 允许上传的音乐视频格式的列表
	private	final String musicvideorex = "[\\w\\W]*(mp3|wma|m4a)+[\\w\\W]*";
	
	// 允许上传的其他文件格式的列表
	private	final String othfilerex = "[\\w\\W]*(txt|doc|docx|xls|ppt)+[\\w\\W]*";
	
	private String servpath = "";
	
	public FileUploadServlet() {
		super();
	}

	public void destroy() {
		super.destroy(); // Just puts "destroy" string in log
  
		// Put your code here
	}

	public void doGet(HttpServletRequest request, HttpServletResponse response)
   
		throws ServletException, IOException {
  
		doPost(request, response);

	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
		throws ServletException, IOException {
  
  
		String oper = StringUtil.getValue(request.getParameter("oper"));
		
		//删除文件
		if(oper.equals("del")){
			
			doDelfile( request, response);
		}else{
		
			doAddfile( request, response);
		}
	}
	public void doAddfile(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {

		
		String webpath = request.getSession().getServletContext().getRealPath("/");
		String tmppath =  GlbFinal.FILEPATH;
		
		String userID = StringUtil.getValue((String)request.getSession().getAttribute(GlbFinal.SESSION_USERID));
		if(!userID.equals("")){
			
			tmppath = tmppath + userID + "\\";
		}
		
		response.setContentType("text/html");
  
		// 设置字符编码为UTF-8, 这样支持汉字显示
		try {
			request.setCharacterEncoding("UTF-8"); 
			response.setCharacterEncoding("UTF-8"); 
		} catch (Exception e) {
			e.printStackTrace();
		}		
  
		// 实例化一个硬盘文件工厂,用来配置上传组件ServletFileUpload
		DiskFileItemFactory dfif = new DiskFileItemFactory();
  
		// 设置上传文件时用于临时存放文件的内存大小,这里是4K.多于的部分将临时存在硬盘
		dfif.setSizeThreshold(4096);

		// 设置存放临时文件的目录,web根目录下的ImagesUploadTemp目录
		dfif.setRepository(new File(webpath + tmppath));
  
		// 用以上工厂实例化上传组件
 		ServletFileUpload sfu = new ServletFileUpload(dfif);
  
		// 设置最大上传尺寸
 		sfu.setSizeMax(MAX_SIZE);
  
		PrintWriter out = response.getWriter();
  
		// 从request得到 所有 上传域的列表
 		List fileList = null;
  
		try {
   
			fileList = sfu.parseRequest(request);
  
		} catch (FileUploadException e) {// 处理文件尺寸过大异常
   
			if (e instanceof SizeLimitExceededException) {
    
				doInfo( "文件尺寸超过规定大小:" + MAX_SIZE + "字节", out);
				return;
			}
			e.printStackTrace();
		}
 		// 没有文件上传
		if (fileList == null || fileList.size() == 0) {
   
			doInfo( "请选择上传文件", out);
			return;
		}

		// 得到所有上传的文件
		Iterator fileItr = fileList.iterator();
  
		// 循环处理所有文件
		while (fileItr.hasNext()) {
   
			FileItem fileItem = null;
   
			String pathfile = null;
  
			long size = 0;
   
			// 得到当前文件
			fileItem = (FileItem) fileItr.next();
   
			// 忽略简单form字段而不是上传域的文件域(<input type="text" />等)
			if (fileItem == null || fileItem.isFormField()) {
   
				String formname=fileItem.getFieldName();//获取form中的名字
				String formcontent=fileItem.getString();
				formname = new String(formname.getBytes(),"gb2312");
				formcontent=new String(formcontent.getBytes(),"gb2312");
				if (formname.equals("id")){
					String id = formcontent;
				}else if(formname.equals("serid")){
					String serid = formcontent;
				}				
				continue;
			}
			// 得到文件的完整路径
			pathfile = fileItem.getName();
   
			// 得到文件的大小
			size = fileItem.getSize();
   
			if ("".equals(pathfile) || size == 0) {
    
				doInfo( "请选择上传文件", out);
				return;
			}

			// 得到去除路径的文件名
			String t_name = pathfile.substring(pathfile.lastIndexOf("\\") + 1);

			// 得到文件的扩展名(无扩展名时将得到全名)
			String t_ext = t_name.substring(t_name.lastIndexOf(".") + 1);
   
			// 拒绝接受规定文件格式之外的文件类型
			if(PatternMa.matchingText(picrex, t_ext.toLowerCase())){
				
				servpath = tmppath + "image\\";
			}else if(PatternMa.matchingText(musicvideorex, t_ext.toLowerCase())){
				
				servpath = tmppath + "flash\\";
			}else if(PatternMa.matchingText(othfilerex, t_ext.toLowerCase())){

				servpath = tmppath + "file\\";
			}else{
				
				out.println("请上传以下类型的文件<p />");
			    
				for (int i = 0; i < allowedExt.length; i++)
     
					out.println("*." + allowedExt[i] + "&nbsp;&nbsp;&nbsp;");
    
				doInfo( "", out);
				return;
			}
			long now = System.currentTimeMillis();
  
			// 根据系统时间生成上传后保存的文件名
			String prefix = String.valueOf(now);
 
			// 保存的最终文件完整路径,保存在web根目录下的目录下
			String u_name =  servpath  + prefix + "." + t_ext;
   
			//检查文件夹是否存在，不存在则创建
        	 File folder = new File(webpath + servpath);   
             if (!folder.exists()) {   
                 folder.mkdirs();   
             }
			try {
				// 保存文件
				fileItem.write(new File(request.getSession().getServletContext().getRealPath("/") + u_name));
				//生成压缩小图片
				if(PatternMa.matchingText(picrex, t_ext.toLowerCase())){
					Jpicmk.createThumbnail(webpath + u_name,
							webpath + servpath+"zip"+ prefix + "." + t_ext, 
							GlbFinal.ZIPPIC_WIDTH, GlbFinal.ZIPPIC_HEIGHT, 1);
				}
			} catch (Exception e) {
   
				e.printStackTrace();
			}
			StringBuffer sb = new StringBuffer();
			sb.append("<script>parent.displayPic('" +
					u_name.replaceAll("\\\\","/") +
					"')</script>");

			out.println(sb.toString());  
			
			return;
		}	
	}
	public void doDelfile(HttpServletRequest request, HttpServletResponse response)
	throws ServletException, IOException {

		String file = StringUtil.getValue(request.getParameter("currfile"));
		if(file.equals("")){
			
			return;
		}
		
		response.setContentType("text/html");
  
		// 设置字符编码为UTF-8, 这样支持汉字显示
		try {
			request.setCharacterEncoding("UTF-8"); 
			response.setCharacterEncoding("UTF-8"); 
		} catch (Exception e) {
			e.printStackTrace();
		}		
  
		PrintWriter out = response.getWriter();
  
		//删除文件
		String filepath = request.getSession().getServletContext().getRealPath("/") + file.replaceAll( "/", "\\\\");
		
		File fF = new File(filepath);   
   		if(fF != null){
   			fF.delete();
   		}			
		
		StringBuffer sb = new StringBuffer();
		out.println(sb.toString());  
			
		return;
		
	}
	
	public void init() throws ServletException {
 
		// Put your code here
		
		
	}
	private void doInfo( String msginfo, PrintWriter out) throws UnsupportedEncodingException{


		String[] js1 = new String[1];
		js1[0] = "/js/common.js";
		out.println(Function.getHtmlHead("文件上传",	"/images/printimg.gif", js1).toString());
		out.println("<script>");
		out.print("alert('");
		out.print(msginfo);
		out.println("');");
		out.println("history.go(-1);");
		out.println("</script>");
		out.println("</body>");
		out.println("</html>");
	}	
	
	
}

